<?php

namespace App\Http\Controllers\Api;

use App\Events\OrderPaid;
use App\Exceptions\InvalidRequestException;
use App\Models\Order;
use Carbon\Carbon;
use Illuminate\Http\Request;

class PaymentController extends Controller
{

    // 手机网站支付宝支付
    public function payByAlipay(Request $request)
    {
        $order = Order::query()->find($request->input('order_id'));
        // 判断订单是否是当前用户订单
        $this->authorize('own', $order);

        // 订单已支付或者已关闭
        if ($order->paid_at || $order->closed) {
            throw new InvalidRequestException('订单状态异常');
        }

        // 这里返回一个 form
        return app('alipay')->wap([
            'out_trade_no' => $order->no,
            'total_amount' => $order->total_amount,
            'subject' => '支付宝 BH-LIVE的订单:' . $order->no
        ]);
    }

    // 手机网站支付前端回调
    public function alipayReturn()
    {
        try {
            app('alipay')->verify();
        } catch (\Exception $e) {
            // todo 数据不正确
        }
        // todo 付款成功
    }

    // 支付宝服务器回调
    public function alipayNotify()
    {
        $data = app('alipay')->verify();
        if (!in_array($data->trade_status, ['TRADE_SUCCESS', 'TRADE_FINISHED'])) {
            return app('alipay')->success();
        }
        // 查询订单
        $order = Order::query()->where('no', $data->out_trade_no)->first();
        // 正常来说不可能出现不存在的订单
        if (!$order) {
            return 'fail';
        }
        // 如果这笔订单的状态已经是已支付
        if ($order->paid_at) {
            // 返回数据给支付宝
            return app('alipay')->success();
        }

        $order->update([
            'paid_at' => Carbon::now(),
            'payment_method' => 'alipay',
            'payment_no' => $data->trade_no   // 支付宝生成的订单号
        ]);

        // 订单支付事件成功后
        $this->afterPaid($order);

        return app('alipay')->success();
    }

    public function afterPaid($order)
    {
        event(new OrderPaid($order));
    }
}
